home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / oplaser.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  4KB  |  192 lines

  1. #include <xsp2lib.h>
  2.  
  3. #include "../otoko.h"
  4. #include "../player.h"
  5. #include "../enemy.h"
  6. #include "../eshot.h"
  7. #include "../effect.h"
  8. #include "../priority.h"
  9. #include "../entry.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13. #define PALET_MAIN    0x0600
  14.  
  15. #define HP_0        150
  16.  
  17. static short EnemyMoveOpLaser (ENEMY *);
  18. static void EnemyTiniOpLaser (ENEMY *);
  19.  
  20. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  21.  
  22. #define ENTRY_CONTROL_ADD    10    /* entry_control に足す値 */
  23.  
  24.  
  25. void EnemyInitOpLaser (ENEMY * p)
  26. {
  27.     p->vx = 0;
  28.     p->vy = 1 * 65536;
  29.     p->hit_px = 24;
  30.     p->hit_py = 16;
  31.     p->hit_sx = 24;
  32.     p->hit_sy = 16;
  33.     p->hit_cx = 6;
  34.     p->damage = p->damage_core = 0;
  35.     p->flash = 0;
  36.     p->hp = HP_0;
  37.     p->pt = obj_oplaser;
  38.     p->core_pt = sp_core01;
  39.     p->seq = 0;
  40.     p->func_enemy_move = EnemyMoveOpLaser;
  41.     p->func_enemy_tini = EnemyTiniOpLaser;
  42.  
  43.     entry_control += ENTRY_CONTROL_ADD;
  44. }
  45.  
  46.  
  47.  
  48. static short EnemyMoveOpLaser (ENEMY * p)
  49. {
  50.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  51.     p->x = (p->lx += p->vx) >> 16;
  52.     p->y = (p->ly += p->vy) >> 16;
  53.  
  54.     switch (p->seq) {
  55.     case 0:
  56.         if (SHORT_LY > 32)
  57.             p->seq++;
  58.         break;
  59.     case 1:
  60.         p->vy -= 2048;
  61.         if (p->vy <= 16384)
  62.             p->seq++;
  63.         break;
  64.     case 2:
  65.         if (p->pt == obj_oplaser + 27)
  66.             SoundSetSE (SE_LOCK);    /* 「がちゃん」という効果音を鳴らす */
  67.         if (p->pt < obj_oplaser + 35) {
  68.             p->pt++;
  69.         } else {
  70.             p->seq++;
  71.             p->s_work = p->s_work2 = 0;
  72.         }
  73.         break;
  74.  
  75.         /* レーザー発射 */
  76.     case 3:
  77. #define INTERVAL_LASER    5
  78. #define SPEED_LASER        24
  79.         switch (p->s_work++) {
  80.         case 4 + INTERVAL_LASER * 1:
  81.             SoundSetSE (SE_LASER);    /* レーザー効果音を鳴らす */
  82.         case 4 + INTERVAL_LASER * 2:
  83.         case 4 + INTERVAL_LASER * 3:
  84.         case 4 + INTERVAL_LASER * 4:
  85.             EshotInit (ESHOT_LASER01, SHORT_LX - 18, SHORT_LY + 20, SPEED_LASER, 64, 0);
  86.             EshotInit (ESHOT_LASER01, SHORT_LX + 18, SHORT_LY + 20, SPEED_LASER, 64, 0);
  87.             break;
  88.         case 4 + INTERVAL_LASER * 10:
  89.             p->s_work = 0;
  90.             if (p->s_work2++ > 2) {
  91.                 p->seq++;
  92.                 p->s_work = p->s_work2 = 0;
  93.             }
  94.         default:
  95.             break;
  96.         }
  97.         break;
  98.  
  99.     case 4:
  100. #if    1
  101. #define INTERVAL4_1        75
  102. #define SPEED_SHOT4_1    10
  103.         if (p->s_work2++ > INTERVAL4_1) {
  104.             if (((p->y + 48) < player->y) && (wabs (p->x - player->x < 48))) {
  105.                 char a = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  106.                 p->s_work2 = 0;
  107.                 EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT4_1, a - 18, 2);
  108.                 //EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT4_1 - 4, a, 2);
  109.                 EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT4_1, a, 2);
  110.                 EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT4_1, a + 18, 2);
  111.                 SoundSetSE (SE_ESHOT_M);
  112.             }
  113.         }
  114. #endif
  115.  
  116.         if (SHORT_LY > 196) {
  117.             p->vy += 4096;
  118.             if (SHORT_LY >= 1)
  119.                 p->seq++;
  120.         }
  121.         break;
  122.  
  123.         /* 撤退 */
  124.     case 5:
  125.         /* 画面外に出たら消去 */
  126.         if (SHORT_LY > 256 + 32)
  127.             return (-1);    /* 消去 */
  128.         break;
  129.     }
  130.  
  131.     /* 自機ショットに当たった時の処理 */
  132.     if (p->damage) {
  133.         if (p->damage_core) {
  134.             SoundSetSE (SE_CORE_DAMAGE);
  135.             p->info = PALET_RED | PRIORITY_BOSS;
  136.             p->damage_core = 0;
  137.         } else {
  138.             SoundSetSE (SE_DAMAGE);
  139.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  140.         }
  141.         if ((p->hp -= p->damage) <= 0) {
  142.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  143.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  144.             if ((p->core_info == (PALET_CORE_RED | PRIORITY_BOSS))
  145.                 || (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS_CORE)))
  146.                 EffectInit (EFFECT_POINTS_RED, POINTS_2500, p->x, p->y);
  147.             else
  148.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_1200, p->x, p->y);
  149.             if (disp_level == DISP_LEVEL_HIGH)
  150.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  151.             return (-1);    /* 消去 */
  152.         }
  153.         p->damage = 0;
  154.         p->flash = TIMER_FLASH_DAMAGE;
  155.     } else {
  156.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 80)) {
  157.             p->info = PALET_RED | PRIORITY_BOSS;
  158.             if (p->flash > TIMER_FLASH_NORMAL)
  159.                 p->flash = 0;
  160.         } else {
  161.             p->info = PALET_MAIN | PRIORITY_BOSS;
  162.         }
  163.     }
  164.     xobj_set_st (p);
  165.  
  166.     /* コアの表示 */
  167.     {
  168.         short priority;
  169.  
  170.         if (p->pt > obj_oplaser + 30)
  171.             priority = PRIORITY_BOSS;
  172.         else
  173.             priority = PRIORITY_BOSS_CORE;
  174.         p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  175.         p->core_y = p->y - 8;
  176.         if (player->y < p->y + 64)    /* 自機との座標の差が小さければ赤 */
  177.             p->core_info = PALET_CORE_RED | priority;
  178.         else
  179.             p->core_info = PALET_CORE_BLUE | priority;
  180.         xsp_set_st (&(p->core_x));
  181.     }
  182.  
  183.     return (0);
  184. }
  185.  
  186.  
  187.  
  188. static void EnemyTiniOpLaser (ENEMY * p)
  189. {
  190.     entry_control -= ENTRY_CONTROL_ADD;
  191. }
  192.